<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>自定义指令</title>
    <script type="text/javascript" src="../js/vue.js"></script>
</head>

<body>
    <!-- 
        需求1: 定义一个v-big指令,和v-text功能类似,但会把绑定的树脂放大10倍.
        需求2: 定义一个v-fbind指令,和b-bind功能类似,但可以让其所绑定的input元素默认获取焦点.
        自定义指令总结:
        1. 定义语法:
            1. 局部指令:
                * new Vue({ directives:{指令名:配置对象} });
                * new Vue({ directives(指令名,回调函数) });
            2. 全局指令:
                * Vue.directive(指令名,配置对象);
                * Vue.directive(指令名,回调函数);
        2. 配置对象中常用的3个回调:
            1. bind: 指令与元素成功绑定时调用
            2. inserted: 指令所在元素被插入页面后调用
            3. update: 指令所在的模板结构被重新解析时调用
        3. 备注:
            1. 指令定义时不加`v-`,但使用时要加`v-`;
            2. 指令名如果是多个单词,要使用`kebab-case`命名方式,不要使用camelCase命名

     -->
    <!-- 准备好一个容器 -->
    <div id="root">
        <h2>当前的n值是:<span v-text="n"></span></h2>
        <h2>放大10倍后的n值是:<span v-big="n"></span></h2>
        <button @click="n++">点我n+1</button>
        <hr />
        <!-- <input type="text" v-fbind:value="n" autofocus>  autofocus属性规定当页面加载时input元素应该自动获得焦点. -->
        <input type="text" v-fbind:value="n">
    </div>

    <div id="root2">
        <input type="text" v-fbind:value="x">
    </div>

</body>
<script type="text/javascript">
    Vue.config.productionTip = false; //阻止Vue启动时生成生产提示
    //定义全局指令
    Vue.directive('fbind', {
        //指令与元素成功绑定时会被调用
        bind(element, binding) {
            console.log('bind', this);
            element.value = binding.value;

        },
        //指令所在元素被插入页面后
        inserted(element, binding) {
            console.log('inserted', this);
            element.focus();
        },
        //指令所在的模板被重新解析时
        update(element, binding) {
            console.log('update', this);
            element.value = binding.value;
            // element.focus();
        }
    });
    Vue.directive('big', function (element, binding) {
        console.log('big', this);  //注意,此处的this是window
        /* console.log(element);
        console.dir(element);
        console.log(element instanceof HTMLElement)
        console.log(binding);
        console.log(binding.value); */
        element.innerText = binding.value * 10;
        // console.log(element, binding.value);
    });

    const vm = new Vue({
        el: '#root',
        data: {
            n: 1
        },
        //局部指令
        directives: {
            //big函数何时会被调用? 1. 指令与元素成功绑定时会被调用 2. 指令所在的模板被重新解析时.
            big(element, binding) {
                console.log('big', this);  //注意,此处的this是window
                /* console.log(element);
                console.dir(element);
                console.log(element instanceof HTMLElement)
                console.log(binding);
                console.log(binding.value); */
                element.innerText = binding.value * 10;
                // console.log(element, binding.value);
            },
            /* 'big-number'(element, binding) {
                element.innerText = binding.value * 10;
            }, */

            fbind: {
                //指令与元素成功绑定时会被调用
                bind(element, binding) {
                    console.log('bind', this);
                    element.value = binding.value;

                },
                //指令所在元素被插入页面时
                inserted(element, binding) {
                    console.log('inserted', this);
                    element.focus();
                },
                //指令所在的模板被重新解析时
                update(element, binding) {
                    console.log('update', this);
                    element.value = binding.value;
                    // element.focus();
                }
            }
        }
    });
    const vm2 = new Vue({
        el: '#root2',
        data: {
            x: 1
        }
    })
</script>

</html>